package com.lonely.fx.list_view;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

/**
 * @date: 2022-07-28 21:34
 * @author: ztkj-hzb
 * @description: 基础类型的 ListView 属性设置
 **/
public class ListViewWithBaseSettingMain extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    /**
     *
     */
    @Override
    public void start(Stage primaryStage) throws Exception {


        AnchorPane anchorPane = new AnchorPane();

        //创建ListView
        ListView<String> listView = new ListView<>();

        //创建数据源
        ObservableList<String> datas = FXCollections.observableArrayList();
        datas.addAll("A", "B", "C", "D", "E", "F", "G", "H", "J");

        //设置数据源
        listView.setItems(datas);

        //设置宽高
        listView.setPrefSize(300, 300);

        //设置单元格大小
        listView.setFixedCellSize(50);

        //设置数据展示方向,默认是垂直
        //listView.setOrientation(Orientation.HORIZONTAL);

        //设置当ListView没有内容的时候，展示内容
        //listView.setPlaceholder(new Label("没有内容"));


        //开启单元格编辑(需要以下两行代码才可以)
        listView.setEditable(true);
        listView.setCellFactory(TextFieldListCell.forListView(new StringConverter<String>() {

            /**
             * 最终展示在页面上的数据
             * @param object
             * @return
             */
            @Override
            public String toString(String object) {
                return object;
            }

            /**
             * 开启可编辑后，回车输入的数据会作为该入参
             * @param string
             * @return
             */
            @Override
            public String fromString(String string) {
                return string + "-- new";
            }
        }));


        //TODO 选择属性设置

        //设置选择模式---可设置单选和多选
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        //选中第一行
        //listView.getSelectionModel().selectFirst();
        //选中最后一行
        //listView.getSelectionModel().selectLast();
        //全选中(需要开启多选才行)
        //listView.getSelectionModel().selectAll();
        //选择指定下标的行
        //listView.getSelectionModel().selectIndices(0, 2, 4);
        //选中指定区间的行 [a,b)
        //listView.getSelectionModel().selectRange(1, 5);
        //选中下一行
        //listView.getSelectionModel().selectNext();
        //选中上一行
        //listView.getSelectionModel().selectPrevious();


        //TODO 获取选择的行数据

        //获取当前模式是单选还是多选
        //System.out.println("选择模式：" + listView.getSelectionModel().getSelectionMode());
        //获取选中的下标
        //System.out.println("选中的下标(单选)：" + listView.getSelectionModel().getSelectedIndex());
        //多选，选中的下标集合
        //System.out.println("选中的下标(多选)" + listView.getSelectionModel().getSelectedIndex());
        //多选，选中的下标内容
        //System.out.println("选中的文本：" + listView.getSelectionModel().getSelectedItems());


        //TODO 滚动条设置

        //在存在滚动条的情况，如果选择的数据实在当前页看不懂，需要拖动滚动条才可以看到，
        // 上面选中最后一行，虽然选中了，但是如果有滚动条，则不会自动滚动到选中的位置，可以用以下方法
        //设置滚动条跳到指定索引位置
        //listView.scrollTo(3);
        //设置滚动条跳到指定内容位置
        //listView.scrollTo("F");


        //TODO 编辑设置

        //双击行，准备开始编辑时触发
        listView.setOnEditStart(new EventHandler<ListView.EditEvent<String>>() {
            @Override
            public void handle(ListView.EditEvent<String> event) {
                System.out.println("准备编辑了....");
                System.out.println(event.getIndex());

                //此时，这个值为null，因为是准备阶段
                //System.out.println(event.getNewValue());
            }
        });

        //取消编辑时触发
        listView.setOnEditCancel(new EventHandler<ListView.EditEvent<String>>() {
            @Override
            public void handle(ListView.EditEvent<String> event) {
                System.out.println("取消编辑了...");
            }
        });


        //敲回车的时候提交数据触发，注意，设置了该方法，会覆盖默认的ListView提供的提交事件，因此数据的修改需要自己实现
        listView.setOnEditCommit(new EventHandler<ListView.EditEvent<String>>() {
            @Override
            public void handle(ListView.EditEvent<String> event) {
                System.out.println("提交编辑了");
                //提交的值
                //System.out.println("newValue：" + event.getNewValue());
                datas.set(event.getIndex(), event.getNewValue());
            }
        });


        //TODO 光标设置

        //设置指定行获取光标,注意 Focus和Select不冲突，可共存
        listView.getFocusModel().focus(1);
        //设置当前行的下一行获取光标
        listView.getFocusModel().focusNext();
        //设置当前行的上一行获取光标
        listView.getFocusModel().focusPrevious();
        //判断指定下标对应的行是否获得了焦点
        System.out.println("第一行是否获得焦点：" + listView.getFocusModel().isFocused(0));
        System.out.println("获取焦点的下标是："+listView.getFocusModel().getFocusedIndex());
        System.out.println("获取焦点的值是："+listView.getFocusModel().getFocusedItem());


        AnchorPane.setLeftAnchor(listView, 100.0);
        anchorPane.getChildren().addAll(listView);
        primaryStage.setScene(new Scene(anchorPane));
        primaryStage.setWidth(500);
        primaryStage.setHeight(500);
        primaryStage.show();

    }
}
